extends Node

# ======================================================
# 游戏全局管理单例
# 负责管理游戏状态、存档、随机数生成等核心系统
# ======================================================


#region 高级随机数生成器
# ------------------------------------------------------
class AdvancedRNG:
	# 随机数生成器核心
	var _rng := RandomNumberGenerator.new()

	# 状态追踪索引（用于保证随机序列可复现）
	var _state_index := 0

	# 基础种子值（整个游戏随机序列的根源）
	var _base_seed := 0

	# 初始化随机系统
	# @param s: 基础种子值
	func initialize(s: int):
		_base_seed = s
		_rng.seed = s
		_state_index = 0

	# 获取当前随机状态（用于存档）
	# @return 包含基础种子和状态索引的字典
	func get_state() -> Dictionary:
		return {
			"base_seed": _base_seed,
			"state_index": _state_index
		}

	# 恢复指定随机状态（用于读档）
	# @param state: 包含基础种子和状态索引的字典
	func restore_state(state: Dictionary):
		_base_seed = state.get("base_seed", 0)
		_state_index = state.get("state_index", 0)
		_rng.seed = _base_seed
		_advance_state(_state_index)

	# 内部方法：推进随机数生成器状态
	# @param steps: 需要推进的步数
	func _advance_state(steps: int):
		for i in steps:
			_rng.randi()

	#region 随机数生成接口
	# --------------------------------------------------
	# 生成随机整数（整个int范围）
	func randi() -> int:
		_state_index += 1
		return _rng.randi()

	# 生成随机浮点数（0.0 ~ 1.0）
	func randf() -> float:
		_state_index += 1
		return _rng.randf()

	# 生成范围浮点数
	# @param from: 最小值（包含）
	# @param to: 最大值（包含）
	func randf_range(from: float, to: float) -> float:
		_state_index += 1
		return _rng.randf_range(from, to)

	# 生成范围整数
	# @param from: 最小值（包含）
	# @param to: 最大值（包含）
	func randi_range(from: int, to: int) -> int:
		_state_index += 1
		return _rng.randi_range(from, to)

	# 权重随机选择
	# @param weights: 权重数组
	# @return 被选中的索引
	func rand_weighted(weights: Array) -> int:
		_state_index += 1
		return _rng.rand_weighted(weights)
	#endregion
#endregion

#region 游戏数据

# 全局随机数生成器实例
var rng := AdvancedRNG.new()
#endregion

#region 生命周期管理
# ------------------------------------------------------
func _ready():
	# 初始化子系统
	load_mods()
	load_assets()
	load_config()
	
func load_config():
	# load_sound_setting()
	# load_window_setting()
	load_language_setting()


func load_language_setting():
	var config := ConfigFile.new()
	config.load(GameConstant.CONFIG_PATH)
	var _locale = config.get_value("language", "language", "zh_CN")
	TranslationServer.set_locale(_locale)


# 加载模组系统
func load_mods():
	load("res://mod_loader/mod_loader.gd").new()


# 删除存档文件
# @return 是否删除成功
func delete_save() -> bool:
	var dir = DirAccess.open("user://")
	if dir.file_exists(GameConstant.SAVE_PATH):
		var error = dir.remove(GameConstant.SAVE_PATH)
		if error == OK:
			return true
		push_error("删除存档失败，错误码：%d" % error)
	return false

# 检查存档是否存在
# @return 是否存在有效存档
func has_save() -> bool:
	return FileAccess.file_exists(GameConstant.SAVE_PATH)

# 退出游戏流程
func quit_game():
	save_game()
	get_tree().quit()
#endregion

#region 存档系统
# ------------------------------------------------------
# 保存游戏状态
func save_game():
	var save_data = {
		"game_data": GameData.to_dict(),
		"rng_state": rng.get_state() # 随机系统状态
	}

	# 写入JSON文件
	var file = FileAccess.open(GameConstant.SAVE_PATH, FileAccess.WRITE)
	if file:
		file.store_string(JSON.stringify(save_data, "\t"))
		GlobalSignal.gs_game_saved.emit()
	else:
		push_error("存档失败，错误码：%d" % FileAccess.get_open_error())


# 加载资源包
func load_assets() -> void:
	var dir := DirAccess.open("assets")
	if not dir:
		return

	# 遍历assets目录下的所有文件
	var files := dir.get_files()
	for file: String in files:
		# 加载所有.pck资源包
		if file.get_extension() == "pck":
			var success := ProjectSettings.load_resource_pack("assets/" + file)
			print('资源包加载结果：', file, ' -> ', success)


func set_race(race: Dictionary):
	GameData.current_race = race.get("name")
	GameData.available_troop_types = race.get("starting_troops", [])
#endregion
